package analizadorLexico.estados;

import analizadorLexico.tokens.Token;
import analizadorLexico.tokens.TokenIden;
import analizadorLexico.tokens.TokenLiteralBooleano;
import analizadorLexico.tokens.TokenResBooleano;
import analizadorLexico.tokens.TokenResCaracter;
import analizadorLexico.tokens.TokenResEntero;
import analizadorLexico.tokens.TokenResEscribe;
import analizadorLexico.tokens.TokenResLee;
import analizadorLexico.tokens.TokenResNatural;
import analizadorLexico.tokens.TokenResReal;
import analizadorLexico.tokens.TokenResTipo;
import analizadorLexico.tokens.TokenResVariable;

public class Estado34 implements Estado{
/*aplico el patron singleton para cada estado*/
	
	/*INSTANCE lo que hace es guardar la instancia de la clase*/
	private static Estado34 INSTANCE = null;    
	private Estado34(){}
	
    private synchronized static void createInstance() {
        if (INSTANCE == null) INSTANCE = new Estado34();
    }
    
    public static Estado getInstance() {
        if (INSTANCE == null) createInstance();
        return INSTANCE;
    }

	public void irASiguienteEstado() {
		
		Contexto.setEstadoActual(EstadoInicial.getInstance());
		
		if(Contexto.getTablaSimbolos().esPalabraReservada(Contexto.getLexema().toString()))
		{
			if(Contexto.getLexema().toString().equals("entero"))
			{
				Contexto.addToken((Token)new TokenResEntero(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			if(Contexto.getLexema().toString().equals("natural"))
			{
				Contexto.addToken((Token)new TokenResNatural(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			if(Contexto.getLexema().toString().equals("real"))
			{
				Contexto.addToken((Token)new TokenResReal(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}

			if(Contexto.getLexema().toString().equals("booleano"))
			{
				Contexto.addToken((Token)new TokenResBooleano(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			if(Contexto.getLexema().toString().equals("caracter"))
			{
				Contexto.addToken((Token)new TokenResCaracter(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}

			if(Contexto.getLexema().toString().equals("lee"))
			{
				Contexto.addToken((Token)new TokenResLee(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			if(Contexto.getLexema().toString().equals("escribe"))
			{
				Contexto.addToken((Token)new TokenResEscribe(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}

			if(Contexto.getLexema().toString().equals("variable"))
			{
				Contexto.addToken((Token)new TokenResVariable(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}

			if(Contexto.getLexema().toString().equals("tipo"))
			{
				Contexto.addToken((Token)new TokenResTipo(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			if(Contexto.getLexema().toString().equals("verdadero"))
			{
				Contexto.addToken((Token)new TokenLiteralBooleano(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			if(Contexto.getLexema().toString().equals("falso"))
			{
				Contexto.addToken((Token)new TokenLiteralBooleano(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
			}
			
			Contexto.moverACaracterAnteriorBuffer();
			Contexto.resetearLexema();
			return;
		}
		
		Contexto.moverACaracterAnteriorBuffer();
		Contexto.addToken((Token)new TokenIden(Contexto.getLexema(),Contexto.getLineaActual(),Contexto.getPosicionLinea()-Contexto.getLexema().length()));
		Contexto.resetearLexema();
	}

}
